package com.cy.jt.security.controller;


import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;

/**
 * 可以将这里的Controller看成是系统内部的一个资源对象,我们
 * 要求访问此对象中的方法时需要进行权限检查.
 */
@RestController
public class ResourceController {
    /**
     * 添加操作     C
     *
     * @PreAuthorize 注解由SpringSecurity框架提供, 用于描述方法,
     * 此注解描述方法后,访问方法首先要进行权限检测
     */
    //@PreAuthorize("hasRole('admin')")//假如登录用户具备admin这个角色可以访问
    @PreAuthorize("hasAuthority('sys:res:create')")
    @RequestMapping("/doCreate")
    public String doCreare(HttpServletResponse response) {
        return "create resource (insert data) ok";
    }

    /**
     * 查询操作     R
     */
    @PreAuthorize("hasAuthority('sys:res:retrieve')")
    @RequestMapping("/doRetrieve")
    public String doRetrieve() {
        return "query resource (select data) ok";
    }

    /**
     * 修改操作     U
     */
    @PreAuthorize("hasAuthority('sys:res:update')")
    @RequestMapping("/update")
    public String update() {
        return "update resource ok";
    }

    /**
     * 删除操作     D
     */
    @PreAuthorize("hasAuthority('sys:res:delete')")
    @RequestMapping("/delete")
    public String delete() {
        return "delete resource (delete data) ok";
    }

    /**
     * 获取登录用户信息?
     * 1)用户登录成功以后信息存储到了哪里
     * 2)如何获取用户登录信息
     * @return
     */
    @GetMapping("/doGetUser")
    public String doGetUser(){
        //从Session中获取用户认证信息
        //1)Authentication 认证对象(封装了登录用户信息的对象)
        //2)SecurityContextHolder 持有登录状态的信息的对象(底层可通过session获取用户信息)
        Authentication authentication =
                SecurityContextHolder.getContext().getAuthentication();
        //基于认证对象获取用户身份信息
        User principal = (User)authentication.getPrincipal();
        System.out.println("principal.class="+principal.getClass());
        return principal.getUsername()+":"+ principal.getAuthorities();
    }
}
